import java.util.*;

/**
 * @author LKQ
 * @date 2021/12/21 18:56
 * @description
 */
public class Solution {
    Map<Integer, Integer> f = new HashMap<Integer, Integer>();
    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.getKth(7, 11, 4));
    }

    public int getKth(int lo, int hi, int k) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = lo; i <= hi; ++i) {
            list.add(i);
        }
        // 排序，如果两个权值不同，那么就返回权重的差值，权重相同就返回本身的差值。
        // 但是u, v会重复计算，如12 13 14，则两次比较为 u = 13， v = 12 | u = 14， v=13
        list.sort((u, v) -> {
            if (getF(u) != getF(v)) {
                return getF(u) - getF(v);
            } else {
                return u - v;
            }
        });
        return list.get(k - 1);
    }

    public int getF(int n) {
        int temp = n;
        if (!f.containsKey(n)) {
            int ans = 0;
            while(n != 1) {
                if (n % 2 == 0) {
                    // 偶数
                    n /= 2;
                }else {
                    n = 3*n +1;
                }
                ans++;
            }
            f.put(temp, ans);
        }
        return f.get(temp);
    }
}
